// 购物车模块
import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'
const cart = {
  namespaced: true,
  state: () => ({
    list: [] // 购物车列表
  }),
  // vuex计算属性  有些数据需要根据state中的数据经过一定的计算得到 getters
  getters: {
    // 总钱数  = 数组中的每一项的单价 * 数量 之和  reduce
    allPrice (state) {
      return state.list.reduce((a, c) => {
        return a + c.count * c.price
      }, 0)
    },
    // 总数
    allCount (state) {
      return state.list.reduce((a, c) => a + c.count, 0)
    },
    // 选中项count之和
    selectedCount (state) {
      return state.list.filter((item) => item.selected).reduce((a, c) => a + c.count, 0)
    },
    // 选中项的钱数之和
    selectedPrice (state) {
      return state.list.filter((item) => item.selected).reduce((a, c) => a + c.count * c.nowOriginalPrice, 0)
    },
    // 全选
    allSelected (state) {
      return state.list.every(item => item.selected === true)
    }
  },
  mutations: {
    setList (state, newList) {
      state.list = newList
    },
    setSelected (state, { curItem, selected }) {
      // 查找 找到之后进行修改
      const item = state.list.find((item) => item.skuId === curItem.skuId)
      item.selected = selected
    }
  },
  actions: {
    // 加入
    async asyncInsertCart (ctx, { skuId, count }) {
      // 加入购物车
      await insertCart({ skuId, count })
      // 去拉取生成的购物车列表
      const res = await findCartList()
      // 调用mutation函数存入state
      ctx.commit('setList', res.data.result)
    },
    // 删除 skuId组成的数组
    async asyncDelCart (ctx, ids) {
      // 删除 后端购物车列表已经是删除之后的了 需要我们手动再次调用购物车列表数据
      // 流程：删除购物车 -> 后端更新购物车列表(数据库) -> 再次调用购物车列表接口 ->
      // 拿到了最新的购物车列表 -> 更新state中的list -> 视图会进行更新(getters数据进行同步)

      await deleteCart(ids)
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 更新购物车
    async updateList (ctx) {
      const res = await findCartList()
      ctx.commit('setList', res.data.result)
    },
    // 单选
    async asyncCheck (ctx, good) {
      // 更新接口
      await updateCart(good)
      // 重新拉取购物车列表
      const res = await findCartList()
      // 重新赋值给state
      ctx.commit('setList', res.data.result)
    },
    // 修改数量
    async asyncChangeNum (ctx, good) {
      // 更新接口
      await updateCart(good)
      // 重新拉取购物车列表
      const res = await findCartList()
      // 重新赋值给state
      ctx.commit('setList', res.data.result)
    },
    // 全选
    async allCheck (ctx, selected) {
      await checkAllCart({ selected, ids: ctx.state.list.map(item => item.skuId) })
      // 重新拉取购物车列表
      const res = await findCartList()
      // 重新赋值给state
      ctx.commit('setList', res.data.result)
    }
  }
}

export default cart
